package com.education.ai.service;

import com.education.ai.entity.Exercise;
import com.education.ai.model.ExerciseRequest;
import java.util.List;
import java.util.Map;

/**
 * 练习题服务接口
 */
public interface ExerciseService {
    /**
     * 获取所有练习题
     */
    List<Exercise> getAllExercises();
    
    /**
     * 根据ID获取练习题
     */
    Exercise getExerciseById(Long id);
    
    /**
     * 保存练习题
     */
    Exercise saveExercise(Exercise exercise);
    
    /**
     * 删除练习题
     */
    void deleteExercise(Long id);
    
    /**
     * 根据学科获取练习题
     */
    List<Exercise> getExercisesBySubject(String subject);
    
    /**
     * 根据年级获取练习题
     */
    List<Exercise> getExercisesByGrade(String grade);
    
    /**
     * 根据学科和年级获取练习题
     */
    List<Exercise> getExercisesBySubjectAndGrade(String subject, String grade);
    
    /**
     * 根据学科、年级和主题获取练习题
     */
    List<Exercise> getExercisesBySubjectAndGradeAndTopic(String subject, String grade, String topic);
    
    /**
     * 生成练习题
     * @param subject 学科
     * @param grade 年级
     * @param topic 主题
     * @param count 数量
     * @return 生成的练习题列表
     */
    List<Exercise> generateExercises(String subject, String grade, String topic, int count);
    
    /**
     * 生成练习题（带教师ID）
     * @param subject 学科
     * @param grade 年级
     * @param topic 主题
     * @param count 数量
     * @param teacherId 教师ID
     * @return 生成的练习题列表
     */
    List<Exercise> generateExercises(String subject, String grade, String topic, int count, String teacherId);
    
    /**
     * 生成练习题（使用请求对象）
     * @param request 请求对象
     * @return 生成的练习题列表
     */
    List<Exercise> generateExercises(ExerciseRequest request);
    
    /**
     * 根据学习阶段、学科、教材、章节生成练习题
     * @param stage 学习阶段
     * @param subject 学科
     * @param textbook 教材
     * @param chapter 章节
     * @param count 题目数量
     * @param questionTypes 题目类型列表
     * @return 生成的练习题列表
     */
    List<Exercise> generateExercises(String stage, String subject, String textbook, String chapter, int count, List<String> questionTypes);
    
    /**
     * 根据学习阶段、学科、教材、章节生成练习题，并指定教师ID
     * @param stage 学习阶段
     * @param subject 学科
     * @param textbook 教材
     * @param chapter 章节
     * @param count 题目数量
     * @param questionTypes 题目类型列表
     * @param teacherId 教师工号
     * @return 生成的练习题列表
     */
    List<Exercise> generateExercises(String stage, String subject, String textbook, String chapter, int count, List<String> questionTypes, String teacherId);
    
    /**
     * 格式化练习题，适配前端接口
     * @param exercises 练习题列表
     * @param questionTypes 题目类型列表
     * @return 格式化后的练习题
     */
    List<Map<String, Object>> formatExercisesForFrontend(List<Exercise> exercises, List<String> questionTypes);
    
    /**
     * 保存前端提交的练习题
     * @param subject 学科
     * @param stage 学习阶段
     * @param chapter 章节
     * @param textbook 教材
     * @param questions 题目数据
     * @return 保存的练习题列表
     */
    List<Exercise> saveExercisesFromFrontend(String subject, String stage, String chapter, String textbook, List<Map<String, Object>> questions);
    
    /**
     * 保存前端提交的练习题，并指定教师ID
     * @param subject 学科
     * @param stage 学习阶段
     * @param chapter 章节
     * @param textbook 教材
     * @param questions 题目数据
     * @param teacherId 教师工号
     * @return 保存的练习题列表
     */
    List<Exercise> saveExercisesFromFrontend(String subject, String stage, String chapter, String textbook, List<Map<String, Object>> questions, String teacherId);
    
    /**
     * 获取热点考题列表
     * @param page 页码
     * @param pageSize 每页数量
     * @param stage 学习阶段
     * @param subject 学科
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 热点考题列表
     */
    List<Map<String, Object>> getHotExercises(Integer page, Integer pageSize, String stage, String subject, String startDate, String endDate);
    
    /**
     * 统计热点考题数量
     * @param stage 学习阶段
     * @param subject 学科
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 热点考题总数
     */
    int countHotExercises(String stage, String subject, String startDate, String endDate);
    
    /**
     * 获取高频错题列表
     * @param page 页码
     * @param pageSize 每页数量
     * @param stage 学习阶段
     * @param subject 学科
     * @param mistakeType 错题类型
     * @return 高频错题列表
     */
    List<Map<String, Object>> getMistakes(Integer page, Integer pageSize, String stage, String subject, String mistakeType);
    
    /**
     * 统计高频错题数量
     * @param stage 学习阶段
     * @param subject 学科
     * @param mistakeType 错题类型
     * @return 高频错题总数
     */
    int countMistakes(String stage, String subject, String mistakeType);
    
    /**
     * 获取错题统计信息
     * @param stage 学习阶段
     * @param subject 学科
     * @return 错题统计信息
     */
    Map<String, Object> getMistakesStats(String stage, String subject);
    
    /**
     * 获取教材章节列表
     * @param subject 学科
     * @param textbook 教材
     * @return 章节列表
     */
    List<Map<String, String>> getTextbookChapters(String subject, String textbook);
    
    /**
     * 获取历史记录
     * @param teacherId 教师ID
     * @param page 页码
     * @param size 每页数量
     * @return 历史记录列表
     */
    List<Map<String, Object>> getExerciseHistory(String teacherId, int page, int size);
    
    /**
     * 根据ID查找习题
     */
    Exercise findById(Long id);
    
    /**
     * 根据科目查找习题
     */
    List<Exercise> findBySubject(String subject);
    
    /**
     * 根据科目和知识点查找习题
     */
    List<Exercise> findBySubjectAndTopic(String subject, String topic);
    
    /**
     * 根据科目和题目类型查找习题
     */
    List<Exercise> findBySubjectAndType(String subject, String type);
    
    /**
     * 根据难度级别查找习题
     */
    List<Exercise> findByDifficultyLevel(Integer level);
    
    /**
     * 保存习题
     */
    Exercise save(Exercise exercise);
    
    /**
     * 批量保存习题
     */
    List<Exercise> saveAll(List<Exercise> exercises);
    
    /**
     * 删除习题
     */
    void deleteById(Long id);
    
    /**
     * 获取推荐习题
     */
    List<Exercise> getRecommendedExercises(String studentId, Integer count);
} 